package com.example.robertluozizhao.java.thread;

/**
 * Created by Lzz on 7/18/2019.
 */

public class RunnableDemo {

    public static void main(String args[]) {

        RunbleTest threadTest01 = new RunbleTest("ThreadTest01");
        RunbleTest threadTest02 = new RunbleTest();

        /**
         * 1.直接调用run 是在主线程调用，没有开启线程的
         */
/*        threadTest01.run();
        new Thread(threadTest01).start();
        new Thread(threadTest02).start();*/


    /**
     * 02 检查两个线程 访问变量时（是拷贝访问数据 还是 共享数据）
     * (存放在堆上的对象可以被所有持有对这个对象引用的线程访问。
     * 当一个线程可以访问一个对象时，它也可以访问这个对象的成员变量。
     * 如果两个线程同时调用同一个对象上的同一个方法，它们将会都访问这个对象的成员变量，
     * 但是每一个线程都拥有这个本地变量的私有拷贝。)
     *
     * 一下测试代码不符合实例
     *
     */
        TestBothVariable testBothVariable = new TestBothVariable();
        RunbleTest threadTest03 = new RunbleTest(testBothVariable);
        RunbleTest threadTest04 = new RunbleTest(testBothVariable);
        new Thread(threadTest03).start();
        new Thread(threadTest04).start();

    }

    public static class RunbleTest implements Runnable {

        String name;
        TestBothVariable bothVariable;

        public RunbleTest() {
        }

        public RunbleTest(String name) {
            this.name = name;
        }

        public RunbleTest(TestBothVariable bothVariable) {
            this.bothVariable = bothVariable;
        }

        @Override
        public void run() {
//            normalTest();//01
            CheckThreadUseVariable();//02
        }

        private void normalTest() {
            //            System.out.println("执行线程："+name);
            System.out.println("执行线程：" + Thread.currentThread().getName());
        }

        /**
         * 2.检查两个线程 访问变量时（是拷贝访问数据 还是 共享数据）
         */
        private void CheckThreadUseVariable() {

            int size = bothVariable.bothVariable;

            for (int i = 0; i < size; i++) {
                try {
                    System.out.println(Thread.currentThread().getName() + " bothVariable:" + bothVariable.bothVariable);
                    Thread.sleep(200);
                    bothVariable.bothVariable -= 1;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public static class TestBothVariable {
        int bothVariable = 20;

    }
}
